package com.zoe.onelink.mybatis.properties;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.util.ArrayList;
import java.util.List;

/**
 * <p>标题: </p>
 * <p>描述: </p>
 * <p>版权: Copyright (c) 2021</p>
 * <p>公司: 智业软件股份有限公司</p>
 *
 * @version: 1.0
 * @author: ruansheng
 * @date: 2021-12-02
 */
@Data
@ConfigurationProperties(prefix = OnelinkMybatisPluginProperties.PREFIX)
public class OnelinkMybatisPluginProperties {

    public static final String PREFIX = "onelink.mybatis.plugins";

    /**
     * 启用onelink分页功能
     */
    private boolean enablePagination = true;

    /**
     * 启用通用字段自动填充
     */
    private boolean enableAutoFillMetaField = false;

    /**
     * 启用预更新拦截器
     */
    private boolean enablePreUpdate = false;

    /**
     * 启用拼音码五笔码功能
     */
    private boolean enableSpellField = false;

    /**
     * 开启查询返回行数拦截器
     */
    private boolean enableQueryLimit = false;

    /**
     * 查询限制器
     */
    private QueryLimit queryLimit = new QueryLimit();

    /**
     * 元字段
     */
    private MetaField metaField = new MetaField();

    /**
     * map key 转驼峰
     */
    private boolean mapKeyUnderscoreToCamelCase = false;

    /**
     * 返回结果为空时,使用可变集合
     */
    private boolean enableModifiableCollResult = false;

    @Data
    public static class QueryLimit {

        /**
         * SQL查询最大返回行数
         */
        private int maxResultRows = 10000;

        /**
         * 超过最大返回行数时候,true:抛出异常,false:丢弃超过最大行数后面的数据
         */
        private boolean throwIfOverLimit = true;

        /**
         * 包含方法名 (例如: com.zoe.mapper.UserMapper.getById)
         * 注意: 如果配置了 includeMethods , 那么 excludeMethods 将失效
         */
        private List<String> includeMethods = new ArrayList<>();

        /**
         * 排除方法名 (例如: com.zoe.mapper.UserMapper.getById)
         * 注意: 如果配置了 includeMethods , 那么 excludeMethods 将失效
         */
        private List<String> excludeMethods = new ArrayList<>();


    }


    @Data
    public static class MetaField {

        /**
         * 创建时间
         */
        private String createdTime = "createdTime";

        /**
         * 修改时间
         */
        private String modifiedTime = "modifiedTime";

        /**
         * 创建人编码
         */
        private String creatorCode = "creatorCode";

        /**
         * 修改人编码
         */
        private String modifierCode = "modifierCode";

        /**
         * 拼音码字段名
         */
        private String spellFieldName = "spellCode";

        /**
         * 五笔码字段名
         */
        private String wbCodeFieldName = "wbzxCode";

    }


}
